package br.com.leilao.dao;

import java.util.ArrayList;

import org.hibernate.Query;

import br.com.leilao.filter.EditalFilter;
import br.com.leilao.model.Edital;
import br.com.leilao.model.Lance;
import br.com.leilao.util.ConstantsEditao;
import br.com.leilao.util.DateUtil;
import br.com.leilao.util.DynamicQuery;

public class EditalDAO extends GenericDAO<Edital> {

	public ArrayList<Edital> findAll(EditalFilter filtro) throws Exception {
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT e FROM Edital e ");
		sql.append("inner join fetch e.produto p ");
		DynamicQuery queryDynamic = new DynamicQuery(sql.toString());

		if (!ConstantsEditao.SELECIONE.equalsIgnoreCase(filtro.getTipo())) {
			queryDynamic.apendFiltro("AND p.tipo = :tipo", filtro.getTipo());
		}

		queryDynamic.apendFiltro(" AND UPPER(p.nome) like UPPER(:nome)", "%"+filtro.getNome() + "%");
	
		if (ConstantsEditao.ABERTO.equalsIgnoreCase(filtro.getEstado())) {
			queryDynamic.apendFiltro("AND e.dataFechamento >= :dataHoje", DateUtil.getDataHoje());
		}

		if (ConstantsEditao.FECHADO.equalsIgnoreCase(filtro.getEstado())) {
			queryDynamic.apendFiltro("AND e.dataFechamento <= :dataHoje", DateUtil.getDataHoje());
		}

		 queryDynamic.apendFiltro(" AND e.dataAbertura >= :dataAbertura ",filtro.getDataAbertura());
		 queryDynamic.apendFiltro(" AND e.dataFechamento <= :dataFechamento ",filtro.getDataFechamento());

		Query query = queryDynamic.executeQuery(getSession());
		
		return (ArrayList<Edital>) query.list();
	}
	
	
	

	public Lance getLanceVencedorEdital(int idEdital) {
		Query query = getSession().getNamedQuery("getVencedorDoEdital");
		query.setMaxResults(1);

		query.setInteger("idEdital", idEdital);

		Lance lance = (Lance) query.uniqueResult();
		return lance;
	}

	public void removerPerdedores(Lance lance) {
		Query query = getSession()
				.createQuery(
						"DELETE FROM Lance l WHERE l.edital.idEdital = :idEdital AND l.idLance != :cdLance");

		query.setInteger("idEdital", lance.getEdital().getIdEdital());
		query.setInteger("cdLance", lance.getIdLance());
		try {

			query.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList<Edital> getEditaisAbertos() {
		Query query = getSession().getNamedQuery("getEditaisAbertos");
		query.setDate("dataHoje", DateUtil.getDataHoje());
		return (ArrayList<Edital>) query.list();
	}

}
